#include <QCoreApplication>

#include <QDebug>

#include <stdio.h>
#include <
QByteArray test1()
{
    char a[20] = "hello world";

    QByteArray b;
    b.setRawData(a, strlen(a));

    printf("%s[%d]: a=0x%08x b.data=0x%08x\n", __func__, __LINE__, a, b.data());
    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

    return b;
}

QByteArray test2()
{
    char *a = "hello world";

    QByteArray b;
    b.setRawData(a, strlen(a));

    printf("%s[%d]: a=0x%08x b.data=0x%08x\n", __func__, __LINE__, a, b.data());
    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

    return b;
}

QByteArray test3()
{
    char *a = (char *)malloc(20);
//    memcpy(a, "Hello World", 12);
    a[0] = 'H';
    a[1] = 0;

    QByteArray b = QByteArray::fromRawData(a, strlen(a));

    printf("%s[%d]: a=0x%08x b.data=0x%08x\n", __func__, __LINE__, a, b.data());
    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

    a[0] = 'J';

    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

    free(a);

    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;


    return b;
}

void test4()
{
    char a[] = {'a', 'b', '0'};

    {
        QByteArray byteArray1;
        byteArray1.setRawData(a, 2);

        QByteArray byteArray2 = byteArray1;

        qDebug() << byteArray1 << byteArray2;
        a[0] = 'c';
        qDebug() << byteArray1 << byteArray2;

        byteArray1.data();
        qDebug("%s[%d]: a[0x%08x] byteArray1.data[0x%08x] = %s byteArray2.data[0x%08x]",__func__,__LINE__,
               a, byteArray1.constData(), byteArray1.constData(), byteArray2.constData() );
    }
    a[0] = 'd';

    QByteArray e = QByteArray::fromRawData(a, 2);
    qDebug("%s[%d]: e[0x%08x] %s",__func__,__LINE__, e.constData(), e.constData());

    QString c = "Hello world";
    QString d = c;
    qDebug("%s[%d]: c[0x%08x] d[0x%08x]",__func__,__LINE__, c.constData(), d.constData());
}

void test5()
{
    char a[] = "abcde";
    QByteArray array1 = QByteArray::fromRawData(a, 5);
    QByteArray array2 = array1;

    char *b = array1.data();
    const char *c = array2.constData();

    a[0] = 'b';

    qDebug("a=%s\nc=%s\nd=%s", a, b, c);
}

void test6()
{
    char a[] = "abcde";
    QByteArray b[2];
    b[0] = QByteArray::fromRawData(a, 5);
    b[1] = QByteArray::fromRawData(a, 5);
}

int main(int argc, char *argv[])
{
//    QByteArray b = test1();
//    printf("b.data = 0x%08x\n", b.data());
//    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

//    b = test2();
//    printf("b.data = 0x%08x\n", b.data());
//    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

//    b = test3();
//    printf("b.data = 0x%08x\n", b.data());
//    qDebug()<<__func__<<"["<<__LINE__<<"]"<<b;

    test4();

    test5();

    return 0;
}
